/*
 * ResolverPedidoFscan.c
 *
 *  Created on: 05/11/2011
 *      Author: ${Petris-Normandia}
 */


#include "DiscPlanning.h"

void resolverPedidos (){


	T_MENSAJE *mensaje;
	void* buffer;


	sem_wait(&sem2);
	sem_wait(&sem1);
	while (1){//falta terminar mensaje matador

	while(listaPlanificada1 != NULL){

		// Mauro
		// Pide el recurso

		pthread_mutex_lock(&mutex_lst1);
		nodo* ptraux=listaPlanificada1;
		//mandar por log lp1 ,pila de recorrido y datos del sector resuelto
		listaPlanificada1=listaPlanificada1->sigu;
		// Mauro
		// Libera el recurso
		pthread_mutex_unlock(&mutex_lst1);
		switch(ptraux->info.modo){

		case (TIPO_CONSOLE):


				buffer = malloc(12);
				memcpy(buffer,&posactual->cylinder,2);
				memcpy(buffer+2,&posactual->sector,2);
				if ((ptraux->sigu==NULL) &&(listaPlanificada2==NULL) ){
					memset(buffer+4,60000,2);
					memset(buffer+6,60000,2);


				}
				else if(ptraux->sigu!=NULL){
				memcpy(buffer+4,&ptraux->sigu->info.cylinder,2);
				memcpy(buffer+6,&ptraux->sigu->info.sector,2);
				}
					else{
						memcpy(buffer+4,&listaPlanificada2->info.cylinder,2);
						memcpy(buffer+6,&listaPlanificada2->info.sector,2);
					}
				memcpy(buffer+8,&ptraux->info.cylinder,2);
				memcpy(buffer+10,&ptraux->info.sector,2);
				mensaje=generarMensaje(TIPO_CONSOLE,12,buffer);
				enviarPorSocketUnix(descriptorSocketUnix,mensaje);
				eliminarMensaje(mensaje);
				//crearPiladeRecorrido(listaPlanificada1->info.cylinder,listaPlanificada1->info.sector);
				posactual->cylinder=ptraux->info.cylinder;
				posactual->sector=ptraux->info.sector + 1;
				if (posactual->sector==parametros->diskSectors)
				posactual->sector=0;
				break;

		case (TIPO_READSECTOR):

		//crearPiladeRecorrido(listaPlanificada1->info.cylinder,listaPlanificada1->info.sector);
		posicionarSector(ptraux->info);
		if((parametros->readTime!=0)&&(ptraux->info.ped_log>1050)){
		sleep(parametros->readTime);}
		readSector(&mensaje,ptraux->info.ID_pedido);
		enviarPorSocket(ptraux->info.socket,mensaje);
		eliminarMensaje(mensaje);
		break;

		case(TIPO_RAID_COPY):

				//crearPiladeRecorrido(listaPlanificada1->info.cylinder,listaPlanificada1->info.sector);
				posicionarSector(ptraux->info);
				writeSector(ptraux->info.content,&mensaje,ptraux->info.ID_pedido);
				free(ptraux->info.content);
				eliminarMensaje(mensaje);
				break;

		case(TIPO_WRITESECTOR):

		//crearPiladeRecorrido(listaPlanificada1->info.cylinder,listaPlanificada1->info.sector);
		posicionarSector(ptraux->info);
		writeSector(ptraux->info.content,&mensaje,ptraux->info.ID_pedido);
		if (ptraux->info.socket!=-1){
			enviarPorSocket(ptraux->info.socket,mensaje);
		}
		free(ptraux->info.content);
		eliminarMensaje(mensaje);
		Writed_Sectors++;
		break;

		case(TIPO_NONPLANNING):
		posactual->cylinder=ptraux->info.cylinder;
		posactual->sector=ptraux->info.sector;
		sem_post(&sem1);
		break;

		}

		free(ptraux);


		if((strcmp(parametros->algoritmo,"fscan")==0)&&(pilaFscan!=NULL))
		fScan(&pilaFscan);
	  sem_wait(&sem1);
	}

	while(listaPlanificada2 != NULL){

		// Mauro
		// Pide el recurso


		pthread_mutex_lock(&mutex_lst2);
		nodo* ptraux=listaPlanificada2;
		//mandar por log lp2, pila de recorrido y datos del sector resuelto
		listaPlanificada2=listaPlanificada2->sigu;
		// Mauro
		// Libera el recurso
		pthread_mutex_unlock(&mutex_lst2);
		switch(ptraux->info.modo){

			case (TIPO_CONSOLE):


					buffer = malloc(12);
					memcpy(buffer,&posactual->cylinder,2);
					memcpy(buffer+2,&posactual->sector,2);
					if ((ptraux->sigu==NULL) &&(listaPlanificada2==NULL) ){
						memset(buffer+4,60000,2);
						memset(buffer+6,60000,2);


					}
					else if(ptraux->sigu!=NULL){
					memcpy(buffer+4,&ptraux->sigu->info.cylinder,2);
					memcpy(buffer+6,&ptraux->sigu->info.sector,2);
					}
						else{
							memcpy(buffer+4,&listaPlanificada2->info.cylinder,2);
							memcpy(buffer+6,&listaPlanificada2->info.sector,2);
						}
					memcpy(buffer+8,&ptraux->info.cylinder,2);
					memcpy(buffer+10,&ptraux->info.sector,2);
					mensaje=generarMensaje(TIPO_CONSOLE,12,buffer);
					enviarPorSocketUnix(descriptorSocketUnix,mensaje);
					eliminarMensaje(mensaje);
					//crearPiladeRecorrido(listaPlanificada1->info.cylinder,listaPlanificada1->info.sector);
					posactual->cylinder=ptraux->info.cylinder;
					posactual->sector=ptraux->info.sector + 1;
					if (posactual->sector==parametros->diskSectors)
					posactual->sector=0;
					break;

			case (TIPO_READSECTOR):

			//crearPiladeRecorrido(listaPlanificada1->info.cylinder,listaPlanificada1->info.sector);
			posicionarSector(ptraux->info);
			if((parametros->readTime!=0)&&(ptraux->info.ped_log>1050)){
			sleep(parametros->readTime);}
			readSector(&mensaje,ptraux->info.ID_pedido);
			enviarPorSocket(ptraux->info.socket,mensaje);
			eliminarMensaje(mensaje);
			break;

			case(TIPO_RAID_COPY):

					//crearPiladeRecorrido(listaPlanificada1->info.cylinder,listaPlanificada1->info.sector);
					posicionarSector(ptraux->info);
					writeSector(ptraux->info.content,&mensaje,ptraux->info.ID_pedido);
					free(ptraux->info.content);
					eliminarMensaje(mensaje);
					break;

			case(TIPO_WRITESECTOR):

			//crearPiladeRecorrido(listaPlanificada1->info.cylinder,listaPlanificada1->info.sector);
			posicionarSector(ptraux->info);
			writeSector(ptraux->info.content,&mensaje,ptraux->info.ID_pedido);
			if (ptraux->info.socket!=-1){
				enviarPorSocket(ptraux->info.socket,mensaje);
			}
			free(ptraux->info.content);
			eliminarMensaje(mensaje);
			Writed_Sectors++;
			break;

			case(TIPO_NONPLANNING):
			posactual->cylinder=ptraux->info.cylinder;
			posactual->sector=ptraux->info.sector;
			if (posactual->sector==parametros->diskSectors)
			posactual->sector=0;
			sem_post(&sem1);
			break;

			}

			free(ptraux);


			if((strcmp(parametros->algoritmo,"fscan")==0)&&(pilaFscan!=NULL))
			fScan(&pilaFscan);
		  sem_wait(&sem1);
		}

}
}



